# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'class6'
__author__ = 'hqDu'
__time__ = '2020-11-11 22:31'
__product_name = 'PyCharm'
# @fileName :class6.py

# 元组与列表区别
# 元组是不可变数据类型，所以元组内元素不可以修改，只可以进行查操作。
# 元组使用小括号()，列表使用中括号[]
# 元组是有序的，可以利用其下标索引
# 元组数据类型存在的原因：为了数据安全
my_list = list('asdasasd')
print(my_list)

# 括号里面是什么数据类型整体就是什么数据类型
a = (1)  # int
a = ('b')  # string
a = (['asd', 89])  # list
print(type(a))  # int/string/list

a = ()  # 创建空元组
a = tuple()  # 创建空元组
a = (1,)  # 元组
a = (['asd', 89],)  # 元组，与a = (['asd', 89]) 相比，()内多了一个,
print(type(a))


a = (1, 2, 3, 4, 5)
print(a[0])
# a[2] = 2  # TypeError: 'tuple' object does not support item assignment元组内元素不支持修改

# 查询元素 in/not in/index/count
# if 2 in a:
#     print("haha")
# else:
#     print("sda")
#
# b = a.index(2)
# print(b)
#
# b = a.count(2)
# print(b)


# 字典，数据量大的时候，比列表运行速度快，并且运用范围要广
# key:value 键值一一对应，且成对存在
# key是唯一的,value可以一样
# key的数据类型必须是不可变数据类型：int、string、元组()、bool，只要有可变数据类型就不可以，一般用字符串当做key
# 可变数据类型：list/字典/
# 字典是可变数据类型，并且是无序的，不可以使用下标索引


# 创建字典，字典定义
my_dict = {
    'key': 'value'
}
print(my_dict)

# ok
my_dict = {
    (): 'value'  # (1, 2, 3): 'value'
}
# 错误，因为列表是可变的，不可以当做key去使用
# my_dict = {
#     []: 'value'
# }
# 错误，括号里面是什么数据类型整体就是什么数据类型，所以本质还是list；TypeError: unhashable type: 'list'
# my_dict = {
#     ([1, 2, 3]): 'value'  # (1, 2, 3): 'value'
# }
# 错误，只要（）里有list，就不是元组，不能有可变数据类型
# my_dict = {
#     ([1, 3, 4],): 'value'  # (1, 2, 3): 'value'
# }

# 创建空字典
my_dict = {

}
my_dict = dict()

my_dict = {'name': 'lebo','age': 18}
# 通过key取值
my_name = my_dict['name']
print(my_name)

# 查
# 通过key查value
my_name = my_dict['name']  # 存在，打印；不存在报错
print(my_name)
# 通过value得到key


# 修改
# 通过key修改value
my_dict['age'] = 10

# 添加，加入key不存在，添加键值对
my_dict['age1'] = 15

# 删除，通过key删除键值对
# del my_dict['age']
# my_dict.clear()  # 空字典

# 方法
# 查看多少组键值对
length = len(my_dict)

# 取出所有的key
print(my_dict.keys())  # dict_keys([])  dict_keys是一种数据类型，需要把此类型转换成list，然后再对列表进行操作
print(list(my_dict.keys()))
# 取出所有的value
print(my_dict.values())  # dict_values([])
print(list(my_dict.values()))  # 元组转列表
print(tuple(list(my_dict.values())))  # 列表转元组

# 键值对成对打印
print(my_dict.items())  # dict_items([]) 直接操作不可，字典需要先转成list，list转tuple，tuple包着键值对

# 如何判断 key/value/键值对 是否存在，默认查key
if 'name' in my_dict:
    print('jaja')
if 'lebo' in my_dict.values():
    print('haha')
if ('name', 'lebo') in my_dict.items():
    print('kakak')

#  key存在，查询打印对应value；不存在，打印None,并且添加到字典中
res = my_dict.setdefault('name')
print(res)
print(my_dict)
#  key不存在，打印None,并且添加('name1','None')到字典中
res = my_dict.setdefault('name1')
print(res)
print(my_dict)
#  key存在，打印键所对应的value，此时'hahha'没有用
res = my_dict.setdefault('name','hahha')
print(res)
print(my_dict)
#  key不存在，打印'hahha',并且添加('name2','hahha')到字典中
res = my_dict.setdefault('name2','hahha')
print(res)
print(my_dict)


#  key存在，查询打印；不存在，打印None,并且不会添加到字典中
res = my_dict.get('name')
print(res)
print(my_dict)
#  key不存在，打印'hahhaa',并且不会添加到字典中
res = my_dict.get('name1','hahhaa')
print(res)
print(my_dict)

# 查看元素：key/get/setdefault/in/not...in/
# get和setdefault主要区别在于是否会对字典改变，get不会对字典改变，setdefault不会对字典改变

# python console不可以敲错内容